package com.codeyang.config.shiro;

import com.codeyang.constans.Constants;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.apache.shiro.web.util.WebUtils;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.Serializable;
import java.util.UUID;

/**
 * 描述: TO-删除标志-DO
 * Shiro 接管 Web 应用的入口 shiro的本质是 Filter 是tomcat的启动的三大组件
 *
 * @author CodeYang_Site
 * @version 2021/4/20 15:37
 */
public class TokenSessionManager extends DefaultWebSessionManager {


    /**
     * 1 -- 因为把mvc集成shiro 首先就是管理url是否认证---
     * 每个请求进入的入口-----
     * 接管 tomcat的 请求响应，原本是如果没有获得 tomcat的jession 就会触发
     * servlet的重定向
     * 但是我们这个是前后端分离项目 不能重定向,也无法好直接获取到jsessionid，这里提出新的解决方案，给前端响应一个每次登录唯一的
     * 类似session的凭证 ---- resp响应给前端，前端每次请求时都把这个token加入自己的 Head中，这样我们可
     * 以通过 token来判断用户的一系列操作
     *
     * @param request
     * @param response
     * @return
     */
    @Override
    protected Serializable getSessionId(ServletRequest request, ServletResponse response) {
        // 1当我们登陆成功时，我们给前端会给一个token ，前端将该Token 保存起来，以后每次发请求时，都要把Token 带过来
        String token = WebUtils.toHttp(request).getHeader(Constants.TOKEN);
        // 2 判断token是否已经存在 没有token就生成一个，有就直接放行
        if (StringUtils.isBlank(token)){
            token= UUID.randomUUID().toString();
        }

        return token;
    }
}
